﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SIAD.Model
{
    /// <summary>
    /// Classe abstraite permettant d'implémenter l'interface IPlay suivant différentes stratégies de jeu
    /// </summary>
    abstract class IAStrategy : MessageSender, IPlay
    {       
        protected Common.CASE_TYPE _thePlayerCaseType;
         /// <summary>
        /// Le type de case du joueur qui utilise 
        /// </summary>
        public Common.CASE_TYPE thePlayerCaseType { get { return _thePlayerCaseType; } set { _thePlayerCaseType = value; } }

        /// <summary>
        /// Le plateau de jeu
        /// </summary>
        protected Plateau _thePlateau;
        /// <summary>
        /// Le plateau de jeu
        /// </summary>
        public Plateau thePlateau { get { return _thePlateau; } set { _thePlateau = value; } }

        #region Constructeur
        public IAStrategy(Plateau thePlateau, Common.CASE_TYPE thePlayerCaseType)
        {
            _thePlayerCaseType = thePlayerCaseType;
            _thePlateau = thePlateau;
        }
        #endregion

        #region Abstract Method
        /// <summary>
        /// Méthode d'initialisation du jeu, permet de placer le joueur
        /// </summary>
        public abstract void PlacePlayer();

        /// <summary>
        /// Méthode de déplacement du joueur
        /// </summary>
        public abstract void MovePlayer();

        /// <summary>
        /// Méthode de placement d'un bloc
        /// </summary>
        public abstract void DropBlock();

        #endregion

        #region Template Method       

        /// <summary>
        /// Template methode permettant de savoir si le joueur peut encore jouer
        /// </summary>
        /// <returns>true si le joueur peut bouger, false sinon</returns>
        public bool canMove()
        {
            // récupération de la localisation du player
            Tuple<int,int> playerLocation = _thePlateau.FindPlayer(_thePlayerCaseType);
        
            // si null on retourne true (cas où le joueur n'est pas encore disposer
            // le plateau
            if(playerLocation == null) {
                return true;
            }

            int ligne = playerLocation.Item1;
            int colonne = playerLocation.Item2;
            // On vérifie ses liberté
            for (int i = ligne - 1; i <= ligne + 1; ++i)
            {
                for (int j = colonne - 1; j <= colonne + 1; ++j)
                {
                    // Si le joueur a ne serai-ce qu'une liberté on retourne true
                    if (_thePlateau[i, j].theCaseType == Common.CASE_TYPE.EMPTY)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }
        #endregion
}
